/**
 * 1.version:2.2 data:2023/2/19
 * 2.用于驱动HT03电机,同时使用了freertos
 * 3.注意can线序问题
 * 4.电机逆时针转为正
 * 5.最好每隔一段时间发送一次命令以追求准确
 */

#ifndef __HT03_DRIVER
#define __HT03_DRIVER

#include "main.h"

// 电机极限PID
#define P_MIN -95.5f // Radians
#define P_MAX 95.5f
#define V_MIN -45.0f // Rad/s
#define V_MAX 45.0f
#define KP_MIN 0.0f // N-m/rad
#define KP_MAX 500.0f
#define KD_MIN 0.0f // N-m/rad/s
#define KD_MAX 5.0f
#define T_MIN -18.0f
#define T_MAX 18.0f

#define HT_CAN hcan1

#ifndef PI
#define PI 3.14159265358979f
#endif

/**
 * ***HT电机参数***
 *
 * Position: 位置 rad
 * Velocity: 速度 rad/s
 * Kp: 位置增益
 * Kd: 速度增益
 * T: 力矩 N*M
 */
typedef struct
{
    uint8_t ID;
    float Kp;
    float Kd;
    float Position;
    float Velocity;
    float Torque;
} HT_measure_t;

// 电机中断回调函数
void HT_CAN_Callback(CAN_RxHeaderTypeDef *pHeader, uint8_t *pBuf);
// 电机初始化,不可以重复初始化
void HT_Init(HT_measure_t *Motor, uint8_t ID, float Kp, float Kd);
// 设置电机零位置
void HT_SetZeroPosition(HT_measure_t *Motor);
// 设置HT电机速度, rad/s
void HT_SetSpeed(HT_measure_t *Motor, float speed);
// 设置HT电机角度, rad
void HT_SetAngle(HT_measure_t *Motor, float angle);

#endif
